"""
权限工具
提供用户权限验证和角色检查功能
"""
from functools import wraps
from flask import current_app
from flask_jwt_extended import get_jwt_identity, verify_jwt_in_request

from app.models.user import User
from app.utils.responses import unauthorized_error, forbidden_error


def jwt_required_with_role(*required_roles):
    """
    验证JWT令牌并检查用户角色的装饰器
    
    参数:
        *required_roles: 所需的用户角色
    
    返回:
        装饰器函数
    """
    def decorator(fn):
        @wraps(fn)
        def wrapper(*args, **kwargs):
            # 验证JWT令牌
            try:
                verify_jwt_in_request()
            except Exception as e:
                current_app.logger.warning(f"JWT验证失败: {str(e)}")
                return unauthorized_error("无效的身份验证令牌")
            
            # 如果没有指定角色，只验证JWT
            if not required_roles:
                return fn(*args, **kwargs)
            
            # 获取用户身份
            user_id = get_jwt_identity()
            user = User.query.get(user_id)
            
            if not user:
                current_app.logger.warning(f"找不到用户ID: {user_id}")
                return unauthorized_error("用户不存在")
            
            # 检查用户角色
            if 'admin' in user.roles:  # 管理员拥有所有权限
                return fn(*args, **kwargs)
            
            if not set(required_roles).intersection(set(user.roles)):
                current_app.logger.warning(f"用户 {user.username} 没有所需角色: {required_roles}")
                return forbidden_error(f"需要以下角色之一: {', '.join(required_roles)}")
            
            return fn(*args, **kwargs)
        return wrapper
    return decorator


def admin_required(fn):
    """
    验证用户是否为管理员的装饰器
    
    参数:
        fn: 被装饰的函数
    
    返回:
        装饰器函数
    """
    return jwt_required_with_role('admin')(fn)


def has_permission(user, permission):
    """
    检查用户是否拥有指定权限
    
    参数:
        user: 用户对象
        permission: 权限标识符
    
    返回:
        用户是否拥有权限
    """
    # 管理员拥有所有权限
    if 'admin' in user.roles:
        return True
    
    # 根据角色权限映射检查权限
    role_permissions = {
        'user': ['view_own_orders', 'create_order', 'update_own_profile'],
        'staff': ['view_orders', 'update_orders', 'view_products', 'view_users'],
        'manager': ['view_orders', 'update_orders', 'create_product', 'update_product', 
                    'view_users', 'update_user', 'view_statistics'],
        'logistics': ['view_orders', 'update_shipping']
    }
    
    # 检查用户的每个角色是否拥有该权限
    for role in user.roles:
        if role in role_permissions and permission in role_permissions[role]:
            return True
    
    return False


def can_manage_resource(user, resource_user_id):
    """
    检查用户是否可以管理特定资源
    
    参数:
        user: 用户对象
        resource_user_id: 资源所有者ID
    
    返回:
        用户是否可以管理该资源
    """
    # 管理员可以管理所有资源
    if 'admin' in user.roles:
        return True
    
    # 管理者可以管理所有资源
    if 'manager' in user.roles:
        return True
    
    # 用户只能管理自己的资源
    return user.id == resource_user_id 